home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / t_os / tie / src / edit.c < prev    next >
C/C++ Source or Header  |  1991-10-18  |  46KB  |  1,595 lines

  1. /*
  2.  *  TMENU.INF Editor    内容編集画面
  3. */
  4.  
  5. #include "config.h"
  6. #include "edit.h"
  7.  
  8. #define ICON_X  32      /*  アイテム・アイコン表示位置  */
  9. #define DT_X    88      /*  編集モードのデータ表示位置  */
  10.  
  11. #define MAX_DSP  5      /*  一度に画面に表示できる数  */
  12. #define item_y(y)   ((y)*ITEM_Y_SIZ+ITEM_Y)
  13.  
  14. typedef struct      /*  メニューを移動したときの位置情報を渡すための構造体  */
  15. {
  16.     int     xpos, ypos ;            /*  開始位置  */
  17.     int     xsiz, ysiz ;            /*  大きさ  */
  18.  
  19.     char    *ttl ;                  /*  タイトル文字列へのポインタ  */
  20.     int     ttlx, ttly ;            /*  タイトル開始位置  */
  21.     int     ttllen ;                /*  タイトル文字数  */
  22.  
  23.     char    *btn[MAX_BTN_MSG] ;     /*  ボタンの文字列  */
  24.     int     btnx[MAX_BTN_MSG] ;     /*  ボタンの位置  */
  25.     int     btny[MAX_BTN_MSG] ;     /*  ボタンの位置  */
  26.     int     btnlen ;                /*  ボタンの文字数  */
  27.     int     btnnum, btnxsiz ;       /*  ボタンの数と大きさ  */
  28.  
  29.     char    *sw[MAX_SW_MSG] ;       /*  スイッチの文字列  */
  30.     int     swx[MAX_SW_MSG] ;       /*  スイッチの位置  */
  31.     int     swy[MAX_SW_MSG] ;       /*  スイッチの位置  */
  32.     int     swxsiz[MAX_SW_MSG] ;    /*  スイッチの大きさ  */
  33.     int     swysiz[MAX_SW_MSG] ;    /*  スイッチの大きさ  */
  34.     int     swlen ;                 /*  スイッチの文字数  */
  35.     int     swnum ;                 /*  スイッチの数  */
  36.  
  37.     char    *msg[MAX_DSP_MSG] ;     /*  メッセージ文字列  */
  38.     int     msgnum, msglen ;        /*  メッセージ文字列の数と文字数  */
  39.  
  40.     int     (*func)(void) ;         /*  画面再描画ルーチンへのポインタ  */
  41. } MENU_PRM ;
  42.  
  43. static  MENU_PRM    mprm = { 0,0 } ;
  44.  
  45. static  int     pos = 0 ;
  46. static  int     vol_size = 0 ;
  47. static  int     menu_event = 0 ;
  48. static  int     curpos = 0 ;
  49. static  int     curlin = 0 ;
  50.  
  51. extern  void    dsp_menu( char *file ) ;
  52. extern  int     dsp_scrn( int num, int rewrite ) ;
  53. extern  void    dsp_icon( int num, INF *ip, int clear ) ;
  54. extern  void    dsp_bar( int num ) ;
  55. extern  void    del_item( int num ) ;   /*  アイテム削除  */
  56. extern  void    dsp_dirmode( int num, INF *ip ) ;
  57. extern  void    TEXT_clip( REGS EVENT *ep, int x, int y, int sw ) ;
  58. extern  void    MOVE_clip( REGS EVENT *ep, int x, int y, int sw ) ;
  59. extern  void    ITEM_clip( REGS EVENT *ep, int x, int y, int sw ) ;
  60. extern  void    MENU_clip( REGS EVENT *ep, int x, int y, int sw ) ;
  61. extern  void    ROLL_clip( REGS EVENT *ep, int x, int y, int sw ) ;
  62. extern  void    click_item( int num ) ; /*  アイテムクリック  */
  63. extern  void    click_text( int num ) ; /*  テキストクリック  */
  64. extern  int     select_icon( u_char *icon_name, u_char *icon_text ) ;
  65.  
  66.  
  67. const   char    init_data[] =   /*  TMENU.INFの1レコード分の初期化データ  */
  68. {
  69.     0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  70.     0x20,0x20,0x20,0x20,0x00,0x00,0x07,0x00,
  71.     0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  72.     0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,
  73.     0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  74.     0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  75.     0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  76.     0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  77.     0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  78.     0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  79.     0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  80.     0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  81.     0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  82.     0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  83.     0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  84.     0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
  85. } ;
  86.  
  87. char    *get_dirmode( int flag )
  88. {
  89.     if( flag == 0x10 )      /*  ディレクトリモード  */
  90.         return " 移 動 " ;
  91.     else
  92.         return " 実 行 " ;
  93. }
  94.  
  95. int     chg_dirmode( int flag )
  96. {
  97.     return ( flag == 0x10 ) ? 0x00 : 0x10 ;
  98. }
  99.  
  100.  
  101. static  void    set_filename( INF *ip, char *path )
  102. {
  103.     auto    int     i ;
  104.     auto    char    *p ;
  105.  
  106.     /*  ファイル名の先頭を確認  */
  107.     if( ( p = strrchr( path, '\\' ) ) == NULL )
  108.         p = path ;
  109.     else
  110.         p ++ ;
  111.  
  112.     /*  ファイル名を整形してコピー  */
  113.     for( i = 0 ; i < 8 && ( *p != ' ' && *p != '.' && *p != '\0' ) ; i ++ )
  114.         ip->fname[i] = *p++ ;
  115.     for( ; i < IR_FNAMLEN ; i ++ )
  116.         ip->fname[i] = ' ' ;
  117.     ip->dot = ( *p == '.' ) ? '.' : ' ' ;
  118.  
  119.     if( *p++ != '\0' )  /*  拡張子があるときはコピー  */
  120.         for( i = 0 ; i < IR_FEXTLEN && *p != '\0' ; i ++ )
  121.             ip->fext[i] = *p++ ;
  122.     else
  123.         i = 0 ;
  124.     for( ; i < IR_FEXTLEN ; i ++ )  /*  あまりは空白を詰める  */
  125.         ip->fext[i] = ' ' ;
  126. }
  127.  
  128. void    init_inf( INF *ip, char *path, char *title, int icon_num )
  129. {
  130.     auto    char    *p ;
  131.     auto    char    buf[ 256 ] ;
  132.  
  133. #if 0
  134.     /*  初期化 全領域をNULLで初期化し、必要なところだけスペースをつめる  */
  135.     for( i = 0, p = (char *)ip ; i < sizeof( INF ) ; i ++ )
  136.         *p++ = '\0' ;
  137.     for( i = 0, p = (char *)ip->space ; i < 21+13+IR_CMDLEN ; i ++ )
  138.         *p++ = ' ' ;
  139. #else
  140.     /*  標準初期化データで初期化する  */
  141.     memcpy( ip, init_data, sizeof( INF ) ) ;
  142. #endif
  143.  
  144.     /*  パラメータを分離したパスリストを生成  */
  145.     strncpy( buf, path, 256 ) ;
  146.     for( p = buf ; *p != '\0' && *p != ' ' ; p ++ ) ;
  147.     *p = '\0' ;
  148.  
  149.     /*  パラメータつきパスリストをセット  */
  150.     strncpy( (char *)ip->cmd, path, IR_CMDLEN ) ;
  151.     ip->cmd[IR_CMDLEN-1] = '\0' ;
  152.     trim( ip->cmd ) ;       /*  行末のスペースは削除  */
  153.  
  154.     /*  アイテム名の指定があれば、セット  */
  155.     if( title != NULL )
  156.         strncpy( (char *)ip->name, title, 13 ) ;
  157.     else
  158.     {
  159.         if( ( p = strrchr( buf, '\\' ) ) == NULL )
  160.             p = buf ;
  161.         if( *p != '\0' )
  162.             p ++ ;
  163.         strncpy( (char *)ip->name, p, 13 ) ;
  164.         ip->name[12] = '\0' ;
  165.     }
  166.  
  167.     /*  アイコン番号の指定があればセット  */
  168.     if( icon_num < 0 || icon_num > 127 )
  169.         ip->icon_num = '\007' ;     /*  デフォルト・アイコン  */
  170.     else
  171.         ip->icon_num = icon_num ;   /*  指定のアイコン  */
  172.  
  173.     /*  ファイル名をセット  */
  174.     set_filename( ip, buf ) ;
  175. }
  176.  
  177. void    refresh_inf( INF *ip )
  178. {
  179.     auto    INF     tmp ;
  180.  
  181.     init_inf( &tmp, (char *)ip->cmd, (char *)ip->name, ip->icon_num ) ;
  182.     tmp.dirflag = ip->dirflag ;
  183.  
  184.     memcpy( ip, &tmp, sizeof( INF ) ) ;
  185. }
  186.  
  187.  
  188. int     edit_text( char file[] )
  189. {
  190.     int     num = 0, rewrite = TRUE ;
  191.     int     ch ;
  192.     int     ret_val = RET_DEFAULT ;
  193.     char    *tmpfile ;
  194.  
  195.     MOS_disp( mos_disp = MOS_OFF ) ;
  196.  
  197.     EVT_reset() ;
  198.     dsp_menu( file ) ;      /*  一番上の行などなど  */
  199.  
  200.     MOS_disp( mos_disp = MOS_ON ) ;
  201.  
  202.     keyflush() ;
  203.     curpos = 0 ;
  204.  
  205.     if( curlin/2+pos >= maxnum )
  206.         curlin = ( maxnum - pos ) * 2 - 1 ;
  207.  
  208.     do
  209.     {
  210.         dsp_scrn( num, rewrite ) ;
  211.         rewrite = FALSE ;
  212.  
  213.         click_text( curlin ) ;
  214.  
  215.         do
  216.         {
  217.             menu_event = 0 ;
  218.  
  219.             EVT_loop( 0,3 ) ;
  220.  
  221.             if( kbhit( ON ) != FALSE )       /*  キー入力センス  */
  222.             {
  223.                 switch( ch = getch() )
  224.                 {
  225.                   case 0x807C:      /*  BREAK : 読み込み  */
  226.                     menu_event = 15 ;   break ;
  227.                   case 0x807D:      /*  COPY : 新規  */
  228.                     menu_event = 4 ;    break ;
  229.  
  230.                   case 0x8066:      /*  PF10 : 終了  */
  231.                     menu_event = 1 ;    break ;
  232.                   case 0x8069:      /*  PF11 : 読み込み  */
  233.                     menu_event = 2 ;    break ;
  234.                   case 0x805B:      /*  PF12 : 書き込み  */
  235.                     menu_event = 3 ;    break ;
  236.  
  237.                   case 0x806E:      /*  前行  */
  238.                     dsp_scrn( pos-1, FALSE ) ;
  239.                     click_text( curlin ) ;
  240.                     break ;
  241.                   case 0x8070:      /*  次行  */
  242.                     dsp_scrn( pos+1, FALSE ) ;
  243.                     click_text( curlin ) ;
  244.                     break ;
  245.  
  246.                   case '\x1E':      /*  上矢印  */
  247.                   case '\x05':      /*  ^E  */
  248.                     if( -- curlin < 0 )
  249.                         curlin += ( dsp_scrn( pos-1, FALSE ) == TRUE ) ? 2:1 ;
  250.                     click_text( curlin ) ;
  251.                     break ;
  252.  
  253.                   case '\x0D':      /*  改行  */
  254.                   case 0x8073:      /*  実行  */
  255.                     curpos = 0 ;
  256.                   case '\x1F':      /*  下矢印  */
  257.                   case '\x18':      /*  ^X  */
  258.                     if( ++ curlin > MAX_DSP*2-1 || curlin/2+pos >= maxnum )
  259.                         curlin -= ( dsp_scrn( pos+1, FALSE ) == TRUE ) ? 2:1 ;
  260.                     click_text( curlin ) ;
  261.                     break ;
  262.  
  263.                   case '\x1B':      /*  ESC は無視  */
  264.                     break ;
  265.  
  266.                   default:
  267.                     putch( ch ) ;
  268.                 }
  269.             }
  270.  
  271.             switch( menu_event )
  272.             {
  273.               case 1:                       /*  終了  */
  274.                 wind_close() ;
  275.                 if( end_assert( file ) == TRUE )
  276.                     ret_val = RET_QUIT ;
  277.                 else
  278.                 {
  279.                     menu_event = 0 ;
  280.                     click_text( curlin ) ;
  281.                     title( file ) ;
  282.                 }
  283.                 break ;
  284.  
  285.               case 2:                       /*  読み込み  */
  286.                 wind_close() ;
  287.                 if( ( tmpfile = load_file() ) == NULL )
  288.                     menu_event = 0 ;
  289.                 else
  290.                 {
  291.                     if( *tmpfile == '\0' )
  292.                         maxnum = 0 ;
  293.                     strcpy( file, tmpfile ) ;
  294.                     rewrite = TRUE ;
  295.                     num = pos = 0 ;
  296.                     title( file ) ;
  297.                 }
  298.                 click_text( curlin ) ;
  299.                 break ;
  300.  
  301.               case 3:                       /*  書き込み  */
  302.                 wind_close() ;
  303.                 if( ( tmpfile = save_file( file ) ) == NULL )
  304.                     menu_event = 0 ;
  305.                 else
  306.                 {
  307.                     strcpy( file, tmpfile ) ;
  308.                     title( file ) ;
  309.                 }
  310.                 click_text( curlin ) ;
  311.                 break ;
  312.  
  313.               case 4:                       /*  新規登録  */
  314.                 wind_close() ;
  315.                 if( ( tmpfile = select_file( NULL, 'N' ) ) == NULL )
  316.                     menu_event = 0 ;
  317.                 else
  318.                 {
  319.                     int     dirmode = 0 ;
  320.  
  321.                     dirmode = sep_dirmode( tmpfile ) ;
  322.                     init_inf( &inf[maxnum], tmpfile, NULL,-1 ) ;
  323.                     inf[maxnum].dirflag = dirmode ;
  324.  
  325.                     if( edit_item( &inf[maxnum] ) == FALSE )   /*  中止  */
  326.                         menu_event = 0 ;
  327.                     else
  328.                     {
  329.                         maxnum ++ ;
  330.                         num = maxnum ;
  331.                         rewrite = TRUE ;
  332.                     }
  333.                 }
  334.                 click_text( curlin ) ;
  335.                 break ;
  336.  
  337.               case 10:                      /*  ↑  */
  338.                 num = pos - 1 ;
  339.                 break ;
  340.  
  341.               case 11:                      /*  ↓  */
  342.                 num = pos + 1 ;
  343.                 break ;
  344.  
  345.               case 12:                      /*  バッファの切り換え  */
  346.                 if( ( tmpfile = change_buf( file ) ) != NULL )
  347.                 {
  348.                     strcpy( file, tmpfile ) ;
  349.                     title( file ) ;
  350.                     rewrite = TRUE ;
  351.                 }
  352.                 break ;
  353.  
  354.               case 15:                      /*  移動モードへ切り換え  */
  355.                 wind_close() ;
  356.                 ret_val = RET_MODE ;
  357.                 break ;
  358.  
  359.               case 100:                     /*  再表示  */
  360.                 num = pos ;
  361.                 rewrite = TRUE ;
  362.                 break ;
  363.  
  364.               default:
  365.                 if( menu_event >= 20 && menu_event < 20+MAX_DSP )
  366.                 {
  367.                     wind_close() ;
  368.                     click_item( menu_event - 20 ) ;
  369.                     menu_event = 0 ;
  370.                     click_text( curlin ) ;
  371.                 }
  372.                 if( menu_event >= 30 && menu_event < 30+MAX_DSP*2 )
  373.                 {
  374.                     click_text( curlin = menu_event - 30 ) ;
  375.                     menu_event = 0 ;
  376.                 }
  377.                 if( menu_event >= 50 && menu_event < 50+MAX_DSP )
  378.                 {
  379.                     wind_close() ;
  380.                     del_item( menu_event - 50 ) ;
  381.                     menu_event = 0 ;
  382.                     click_text( curlin ) ;
  383.                 }
  384.                 if( menu_event >= 60 && menu_event < 60+MAX_DSP )
  385.                 {
  386.                     int     inum = pos + menu_event - 60 ;
  387.  
  388.                     inf[inum].dirflag = chg_dirmode( inf[inum].dirflag ) ;
  389.  
  390.                     MOS_disp( MOS_OFF ) ;
  391.                     dsp_dirmode( menu_event-60, &inf[inum] ) ;
  392.                     MOS_disp( MOS_ON ) ;
  393.  
  394.                     menu_event = 0 ;
  395.                 }
  396.             }
  397.  
  398.         } while( menu_event == 0 ) ;
  399.  
  400.     } while( ret_val == RET_DEFAULT ) ;
  401.  
  402.     return( ret_val ) ;
  403. }
  404.  
  405. static  void    click_item( int num )   /*  アイテムクリック  */
  406. {
  407.     int     inum, y ;
  408.  
  409.     /*  アイコン変更  */
  410.     if( ( inum = select_icon( inf[num+pos].name, inf[num+pos].cmd ) ) == -1 )
  411.         return ;
  412.  
  413.     inf[ num + pos ].icon_num = inum ;
  414.  
  415.     y = item_y( num )+8 ;
  416.     dsp_box( ICON_X,y, ICON_X+31,y+31, 15,15,15 ) ;
  417.     dsp_ptn( ICON_X,y, (char *)&icon[ inum ], 1 ) ;
  418. }
  419.  
  420. static  void    click_text( int num )   /*  テキストクリック  */
  421. {
  422.     int     inum = pos + num / 2 ;
  423.     int     y = item_y( num / 2 ) ;
  424.  
  425.     if( inum >= maxnum )
  426.         return ;
  427.  
  428.     if( ( num % 2 ) == 0 )
  429.         wind_open( DT_X+2,y+2, 12,&curpos, 0,15,5, (char *)inf[inum].name ) ;
  430.     else
  431.         wind_open( DT_X+2,y+28, 63,&curpos, 0,15,5, (char *)inf[inum].cmd ) ;
  432. }
  433.  
  434. static  void    del_item( int num )     /*  アイテム削除  */
  435. {
  436.     int     inum = pos + num ;
  437.     char    tmp[64] ;
  438.  
  439.     chg_palette( 0, now_palet = 1 ) ;
  440.  
  441.     sprintf( tmp, "「%s」を削除します", inf[inum].name ) ;
  442.     msg[0] = tmp ;
  443.     msg[1] = NULL ;
  444.  
  445.     if( select_mode( msg_kakunin, msg, msg_btn2 ) == 0 )
  446.     {
  447.         del_inf( inum ) ;
  448.         dsp_scrn( pos, TRUE ) ;
  449.  
  450.         if( curlin/2+pos+1 > maxnum )
  451.             curlin = ( maxnum - pos ) * 2 - 1 ;
  452.     }
  453.  
  454.     chg_palette( 0, now_palet = 0 ) ;
  455. }
  456.  
  457. static  void    dsp_menu( char *file )
  458. {
  459.     int     i, y ;
  460.  
  461.     dsp_menu2( file, MENU_clip, MOVE_clip ) ;   /*  編集/移動 共通部分  */
  462.  
  463.     dsp_ptn( MD_X+1,MD_Y+1, ptn_edit, 0 ) ;
  464.  
  465.     for( i = 0 ; i < MAX_DSP ; i ++ )
  466.     {
  467.         y = item_y( i ) ;
  468.         EVT_set_node( ICON_X-1,y+8-1, ICON_X+32,y+8+32,
  469.                                         1, ITEM_clip, 20+i, FALSE ) ;
  470.         EVT_set_node( DT_X,y, DT_X+8*12+2,y+19,
  471.                                         1, TEXT_clip, 30+i*2, FALSE ) ;
  472.         EVT_set_node( DT_X,y+26, DT_X+8*63+2,y+45,
  473.                                         1, TEXT_clip, 31+i*2, FALSE ) ;
  474.         EVT_set_node( DT_X+8*55+5,y, DT_X+8*63+2,y+19,
  475.                                         1, MENU_clip, 50+i, FALSE ) ;
  476.         EVT_set_node( DT_X+8*45+5,y, DT_X+8*53+2,y+19,
  477.                                         1, MENU_clip, 60+i, FALSE ) ;
  478.     }
  479. }
  480.  
  481. /*  アイテムを表示する  */
  482.  
  483. static  int     dsp_scrn( int num, int rewrite )
  484. {
  485.     int     i, dif ;
  486.     int     st, ed ;
  487.     static  struct
  488.     {
  489.         short x1, y1, x2, y2 ;
  490.     } para = { SCR_X1,SCR_Y1, SCR_X2,SCR_Y2 } ;
  491.  
  492.     wind_close() ;  /*  再表示したら入力は終了  */
  493.  
  494.     if( num + MAX_DSP > maxnum )
  495.         num = maxnum - MAX_DSP ;
  496.     if( num < 0 )
  497.         num = 0 ;
  498.  
  499.     if( rewrite != TRUE && ( dif = pos - num ) == 0 )
  500.     {
  501.         MOS_disp( mos_disp ) ;
  502.         return FALSE ;
  503.     }
  504.  
  505.     MOS_disp( MOS_OFF ) ;
  506.     EGB_color( egbwork, 1, 15 ) ;
  507.  
  508.     if( rewrite == TRUE || abs( dif ) > 3 )     /*  再表示  */
  509.     {
  510.         dsp_box( SCR_X1,SCR_Y1, SCR_X2,SCR_Y2, 15,15,15 ) ;
  511.         st = 0 ;    ed = ( maxnum-num > MAX_DSP ) ? MAX_DSP : (maxnum-num) ;
  512.     }
  513.     else if( dif < 0 )
  514.     {
  515.         EGB_partScroll( egbwork, 1, 0, ITEM_Y_SIZ*dif, (char *)¶ ) ;
  516.         st = MAX_DSP+dif ;    ed = MAX_DSP ;
  517.     }
  518.     else if( dif > 0 )
  519.     {
  520.         EGB_partScroll( egbwork, 1, 0, ITEM_Y_SIZ*dif, (char *)¶ ) ;
  521.         st = 0 ;    ed = dif ;
  522.     }
  523.     else
  524.         st = 0, ed = 0 ;
  525.  
  526.     pos = num ;
  527.  
  528.     for( i = st ; i+num < maxnum && i < ed ; i ++ )
  529.         dsp_icon( i, &inf[i+num], FALSE ) ;
  530.  
  531.     dsp_bar( num ) ;
  532.  
  533.     MOS_disp( mos_disp ) ;
  534.  
  535.     return TRUE ;
  536. }
  537.  
  538. static  void    dsp_dirmode( int num, INF *ip )
  539. {
  540.     int     y = item_y( num ) ;
  541.  
  542.     dsp_box( DT_X+8*45+7,y+2, DT_X+8*53+2+1,y+19+1, 1,1,1 ) ;
  543.     dsp_box( DT_X+8*45+5,y,   DT_X+8*53+2,  y+19,   1,1,15 ) ;
  544.     wrt( get_dirmode( ip->dirflag ), writepage,
  545.                          DT_X+8*45+8,y+2, COL_1,COL_15, 16 ) ;
  546. }
  547.  
  548. /*  アイテム1個を表示する  */
  549.  
  550. static  void    dsp_icon( int num, INF *ip, int clear )
  551. {
  552.     int     y ;
  553.  
  554.     y = item_y( num ) ;
  555.  
  556.     if( clear == TRUE )
  557.         dsp_box( SCR_X1,y, SCR_X2,y+48, 15,15,15 ) ;
  558.  
  559.     dsp_ptn( ICON_X,y+8, (char *)&icon[ ip->icon_num ], 1 ) ;
  560.  
  561.     ip->name[12] = '\0' ;
  562.     wrt( (char *)ip->name, writepage, DT_X+2,y+2, COL_1,BAK_COL, 16 ) ;
  563.     box( DT_X,y, DT_X+8*12+2,y+19, 0, -1, 0 ) ;
  564.  
  565.     ip->cmd[63] = '\0' ;
  566.     wrt( (char *)ip->cmd, writepage, DT_X+2,y+28, COL_1,BAK_COL, 16 ) ;
  567.     box( DT_X,y+26, DT_X+8*63+2,y+45, 0,-1,0 ) ;
  568.  
  569.     dsp_dirmode( num, ip ) ;
  570.  
  571.     dsp_box( DT_X+8*55+7,y+2, DT_X+8*63+2+1,y+19+1, 1,1,1 ) ;
  572.     dsp_box( DT_X+8*55+5,y,   DT_X+8*63+2,  y+19,   1,1,15 ) ;
  573.     wrt( " 削 除 ", writepage, DT_X+8*55+8,y+2, COL_1,COL_15, 16 ) ;
  574. }
  575.  
  576.  
  577. /*  スクロール・バーを表示する  */
  578.  
  579. static  void    dsp_bar( int num )
  580. {
  581.     auto    int     sz, ps ;
  582.     auto    int     x = BAR_X ;
  583.     auto    int     y = BAR_Y ;
  584.     static  char    *vol_ptn = NULL ;
  585.  
  586.     if( maxnum == 0 )
  587.     {
  588.         sz = BAR_SIZ ;
  589.         vol_size = ps = 0 ;
  590.     }
  591.     else
  592.     {
  593.         if( ( sz = BAR_SIZ * MAX_DSP / maxnum ) > BAR_SIZ )
  594.             sz = BAR_SIZ ;
  595.         vol_size = ( BAR_SIZ - sz ) ;
  596.         ps = BAR_SIZ * num / maxnum ;
  597.     }
  598.  
  599.     if( vol_ptn == NULL )
  600.     {
  601.         dsp_box( x, y, x+19, y+BAR_SIZ+5, 0,0,15 ) ;
  602.         dsp_box( x+7, y+3, x+12, y+BAR_SIZ+2, 0,0,8 ) ;
  603.         if( ( vol_ptn = (char *)malloc( 20*(BAR_SIZ+7)+16) ) != NULL )
  604.         {
  605.             DWORD(vol_ptn+0) = (int)vol_ptn + 16 ;
  606.             WORD(vol_ptn+4) = getds() ;
  607.             WORD(vol_ptn+6) = x ;
  608.             WORD(vol_ptn+8) = y ;
  609.             WORD(vol_ptn+10) = x+19 ;
  610.             WORD(vol_ptn+12) = y+BAR_SIZ+5 ;
  611.             EGB_getBlock( egbwork, vol_ptn ) ;
  612.         }
  613.     }
  614.     else
  615.         EGB_putBlock( egbwork, 0, vol_ptn ) ;
  616.     dsp_box( x+3, y+ps+3, x+16, y+ps+sz+3, 0,0,15 ) ;
  617. }
  618.  
  619.  
  620. /*  スクロール・バーのクリップ  */
  621.  
  622. static  void    MOVE_clip( REGS EVENT *ep, int x, int y, int sw )
  623. {
  624.     x = x, sw = sw ;     /*  意味なし。ワーニングを避けるため  */
  625.  
  626.     switch( ep->now )
  627.     {
  628.       case EVT_ON_MOS:
  629.         mos_ptn( 1 ) ;
  630.         break ;
  631.  
  632.       case EVT_CLIP_MOS:
  633.         mos_ptn( 1 ) ;
  634.         MOS_horizon( ep->x1+9, ep->x1+11 ) ;
  635.         MOS_vertical( ep->y1, ep->y2 ) ;
  636.         ep->now = EVT_REP_MOS ;
  637.       case EVT_REP_MOS:
  638.         if( vol_size > 0 )
  639.             dsp_scrn( ( y - ep->y1 ) * maxnum / BAR_SIZ, FALSE ) ;
  640.         click_text( curlin ) ;
  641.         break ;
  642.  
  643.       case EVT_DOLACK_MOS:
  644.         ep->now = EVT_NON ;
  645.       case EVT_OFF_MOS:
  646.       case EVT_MOVE_MOS:
  647.       case EVT_SELECT_MOS:
  648.         mos_ptn( 0 ) ;
  649.         MOS_horizon(  MIN_HORIZON,  MAX_HORIZON  ) ;
  650.         MOS_vertical( MIN_VERTICAL, MAX_VERTICAL ) ;
  651.         break ;
  652.     }
  653. }
  654.  
  655.  
  656. static  void    TEXT_clip( REGS EVENT *ep, int x, int y, int sw )
  657. {
  658.     sw = sw, y = y ;        /*  意味なし  ワーニング回避  */
  659.  
  660.     switch( ep->now )
  661.     {
  662.       case EVT_ON_MOS:      /*  ボタンの上にいるときは、カーソルを変更  */
  663.       case EVT_CLIP_MOS:
  664.         mos_ptn( 6 ) ;
  665.         break ;
  666.  
  667.       case EVT_DOLACK_MOS:  /*  外れたら戻す  */
  668.         ep->now = EVT_NON ;
  669.       case EVT_MOVE_MOS:
  670.       case EVT_OFF_MOS:
  671.         mos_ptn( 0 ) ;
  672.         break ;
  673.  
  674.       case EVT_SELECT_MOS:  /*  その場で離すと、その位置へ移動  */
  675.         menu_event = ep->no ;
  676.         curpos = ( x - ep->x1 ) / 8 ;
  677.         mos_ptn( 6 ) ;
  678.         break ;
  679.     }
  680. }
  681.  
  682.  
  683. /*  アイテムのクリック  */
  684.  
  685. static  void    ITEM_clip( REGS EVENT *ep, int x, int y, int sw )
  686. {
  687.     x = x, y = y, sw = sw ;   /*  意味なし。ワーニングを避けるため  */
  688.  
  689.     if( ( ep->no < 30 && pos+ep->no-20 >= maxnum ) ||
  690.         ( ep->no >= 30 && pos+(ep->no-30)/2 >= maxnum ) )
  691.     {
  692.         ep->now = EVT_NON ;
  693.         return ;
  694.     }
  695.  
  696.     switch( ep->now )
  697.     {
  698.       case EVT_ON_MOS:
  699.         mos_ptn( 6 ) ;
  700.         break ;
  701.  
  702.       case EVT_SELECT_MOS:
  703.         menu_event = ep->no ;
  704.         DSP_clip_off( ep ) ;
  705.         MOS_disp( MOS_OFF ) ;
  706.         if( ep->no >= 20 && ep->no < 30 )
  707.             box2( ep->x1,ep->y1, ep->x2,ep->y2, 15,15 ) ;
  708.         curpos = ( x - ep->x1 ) / 8 ;
  709.         MOS_disp( MOS_ON ) ;
  710.         mos_ptn( 6 ) ;
  711.         break ;
  712.  
  713.       case EVT_OFF_MOS:
  714.         mos_ptn( 0 ) ;
  715.         break ;
  716.  
  717.       case EVT_CLIP_MOS:
  718.         mos_ptn( 6 ) ;
  719.         DSP_clip_on( ep ) ;
  720.         break ;
  721.  
  722.       case EVT_DOLACK_MOS:
  723.         ep->now = EVT_NON ;
  724.       case EVT_MOVE_MOS:
  725.         DSP_clip_off( ep ) ;
  726.         MOS_disp( MOS_OFF ) ;
  727.         if( ep->no >= 20 && ep->no < 30 )
  728.             box2( ep->x1,ep->y1, ep->x2,ep->y2, 15,15 ) ;
  729.         MOS_disp( MOS_ON ) ;
  730.         mos_ptn( 0 ) ;
  731.         break ;
  732.  
  733.       case EVT_DLSEL_MOS:
  734.         break ;
  735.     }
  736. }
  737.  
  738. static  void    MENU_clip( REGS EVENT *ep, int x, int y, int sw )
  739. {
  740. #define TICK_LIMIT 2000
  741.     static  int     tick = 0 ;
  742.     auto    int     now ;
  743.  
  744.     x = x, y = y, sw = sw ;    /*  意味なし。ワーニングを避けるため  */
  745.     now = ep->now ;
  746.  
  747.     switch( now )
  748.     {
  749.       case EVT_ON_MOS:
  750.         mos_ptn( 1 ) ;
  751.         break ;
  752.  
  753.       case EVT_OFF_MOS:
  754.         mos_ptn( 0 ) ;
  755.         break ;
  756.  
  757.       case EVT_CLIP_MOS:
  758.         mos_ptn( 1 ) ;
  759.         DSP_clip_on( ep ) ;
  760.         if( ep->rep != FALSE )
  761.             ep->now = EVT_REP_MOS ;
  762.         tick = 0 ;
  763.         break ;
  764.  
  765.       case EVT_REP_MOS:
  766.         if( ++tick > TICK_LIMIT )
  767.         {
  768.             menu_event = ep->no ;
  769.             tick = 0 ;
  770.         }
  771.         break ;
  772.  
  773.       case EVT_DOLACK_MOS:
  774.         ep->now = EVT_NON ;
  775.       case EVT_MOVE_MOS:
  776.         DSP_clip_off( ep ) ;
  777.         mos_ptn( 0 ) ;
  778.         break ;
  779.  
  780.       case EVT_SELECT_MOS:
  781.         menu_event = ep->no ;
  782.         DSP_clip_off( ep ) ;
  783.         mos_ptn( 0 ) ;
  784.         break ;
  785.     }
  786. }
  787.  
  788. void    click_cancel( void )
  789. {
  790.     cancel_on = TRUE ;
  791. }
  792.  
  793. static  void    ROLL_clip( REGS EVENT *ep, int x, int y, int sw )
  794. {
  795.     int     tx = x, ty = y ;
  796.     int     lx = mprm.xpos, ly = mprm.ypos ;
  797.  
  798.     switch( ep->now )
  799.     {
  800.       case EVT_ON_MOS:
  801.         mos_ptn( 1 ) ;
  802.         break ;
  803.  
  804.       case EVT_CLIP_MOS:
  805.         mos_ptn( 3 ) ;
  806.  
  807.         MOS_horizon ( x-mprm.xpos+1, 639-((mprm.xpos+mprm.xsiz)-x) ) ;
  808.         MOS_vertical( y-mprm.ypos+1, 459-((mprm.ypos+mprm.ysiz)-y) ) ;
  809.  
  810.         do {
  811.             lx += x - tx ;  ly += y - ty ;
  812.             box( lx,ly, lx+mprm.xsiz,ly+mprm.ysiz, 15,-1,MODE_XOR ) ;
  813.  
  814.             tx = x ; ty = y ;
  815.             MOS_disp( MOS_ON ) ;
  816.             do {
  817.                 MOS_PAD_rdpos( &sw, &x, &y ) ;
  818.             } while( ( sw & 1 ) != 0 && x == tx && y == ty ) ;
  819.  
  820.             MOS_disp( MOS_OFF ) ;
  821.             box( lx,ly, lx+mprm.xsiz,ly+mprm.ysiz, 15,-1,MODE_XOR ) ;
  822.         } while( ( sw & 1 ) != 0 ) ;
  823.  
  824.         if( lx != mprm.xpos || ly != mprm.ypos )
  825.         {
  826.             MOS_disp( MOS_OFF ) ;
  827.             mprm.xpos = lx ;   mprm.ypos = ly ;
  828.             mprm.func() ;
  829.         }
  830.  
  831.         MOS_horizon ( mprm.xpos, mprm.xpos+mprm.xsiz ) ;
  832.         MOS_vertical( mprm.ypos, mprm.ypos+mprm.ysiz ) ;
  833.  
  834.         menu_event = 999 ;
  835.         ep->now = EVT_SELECT_MOS ;
  836.         MOS_disp( MOS_ON ) ;
  837.         break ;
  838.  
  839.       case EVT_DOLACK_MOS:
  840.         ep->now = EVT_NON ;
  841.       case EVT_MOVE_MOS:
  842.       case EVT_OFF_MOS:
  843.         mos_ptn( 0 ) ;
  844.         break ;
  845.  
  846.       case EVT_SELECT_MOS:
  847.         mos_ptn( 0 ) ;
  848.         menu_event = 999 ;
  849.         break ;
  850.     }
  851. }
  852.  
  853.  
  854. /*  アイコンの一覧が表示され、どれかを選択する  */
  855.  
  856. static  int     DSP_select_icon( void )
  857. {
  858.     auto    int     i, x,y ;
  859.     auto    int     xpos,ypos, xend,yend ;
  860.     auto    int     ttlx, ttly ;
  861.     auto    int     btnx, btny ;
  862.     static  int     already_get = -1 ;
  863.     static  char    *ptn = NULL ;
  864.  
  865.     if( ptn == NULL )
  866.     {
  867.         if( ( ptn = (char *)
  868.                 malloc( (mprm.xsiz+31) * (mprm.ysiz+16) * 4 / 8 ) ) == NULL )
  869.             return -1 ;
  870.  
  871.         EGB_resolutionRam( egbwork, 0x80, 4,
  872.             ( mprm.xsiz + 31 ) / 32 * 32, mprm.ysiz+2, ptn ) ;
  873.     }
  874.  
  875.     if( load_count != already_get || already_get == -1 )
  876.     {
  877.         cls( 0x80, 0 ) ;
  878.  
  879.         xpos = ypos = 0 ;
  880.         xend = mprm.xsiz ;
  881.         yend = mprm.ysiz ;
  882.         ttlx = mprm.ttlx ; ttly = ypos + 8 ;
  883.         btnx = mprm.btnx[0] ; btny = yend - 24 ;
  884.  
  885.         dsp_box( 0,0, xend,yend, 15,15,15 ) ;           /*  全体  */
  886.         dsp_box( 2,2,  xend-2,30, 7,8,15 ) ;            /*  タイトル  */
  887.         dsp_box( 2,32, xend-2,78, 7,8,15 ) ;            /*  テキスト  */
  888.         dsp_box( 2,80, xend-2,yend-32, 7,8,15 ) ;       /*  パレット  */
  889.         dsp_box( 2,yend-30, xend-2,yend-2, 7,8,15 ) ;   /*  取消      */
  890.  
  891.         dsp_box( ttlx-4,ttly-4, ttlx+132,ttly+20, 7,8,5 ) ;
  892.  
  893.         dsp_box( xpos+8,ypos+34, xend-8,ypos+54, 7,8,5 ) ;
  894.         dsp_box( xpos+8,ypos+56, xend-8,ypos+76, 7,8,5 ) ;
  895.  
  896.         dsp_box( btnx-2,btny-4, btnx+66,btny+20, 7,8,5 ) ;
  897.  
  898.         for( i = 0 ; i < 128 ; i ++ )
  899.         {
  900.             x =  8 + ( i % 8 ) * 34 + ( i / 64 ) * 280 ;
  901.             y = 34 + ( ( i / 8 ) % 8 ) * 34 + 48 ;
  902.  
  903.             box2( x,y, x+32,y+32, 15,0 ) ;
  904.             dsp_ptn( x,y, (char *)&icon[ i ], 1 ) ;
  905.         }
  906.  
  907.         already_get = load_count ;
  908.     }
  909.  
  910.     cls( 1, 0 ) ;       /*  物理VRAMに切り換え  */
  911.  
  912.     xpos = mprm.xpos ;
  913.     ypos = mprm.ypos ;
  914.     xend = xpos + mprm.xsiz ;
  915.     yend = ypos + mprm.ysiz ;
  916.     ttlx = xpos + mprm.ttlx ; ttly = ypos + 8 ;
  917.     btnx = xpos + mprm.btnx[0] ; btny = yend - 24 ;
  918.  
  919.     getputBlock( xpos,ypos, xend,yend, ptn, FALSE ) ;
  920.  
  921.     wrt( "  アイコン選択", writepage, ttlx,ttly, COL_14,COL_5, 16 ) ;
  922.     wrt( " 中  止 ", writepage, btnx,btny, COL_14,COL_5, 16 ) ;
  923.  
  924.     wrt( mprm.msg[0], writepage, xpos+12,ypos+37, COL_1,COL_5, 16 ) ;
  925.     wrt( mprm.msg[1], writepage, xpos+12,ypos+59, COL_1,COL_5, 16 ) ;
  926.  
  927.     EVT_level_free( 5 ) ;
  928.     for( i = 0 ; i < 128 ; i ++ )
  929.     {
  930.         x = xpos + 8 + ( i % 8 ) * 34 + (i / 64 )*280 ;
  931.         y = ypos + 34 + ( ( i / 8 ) % 8 ) * 34 + 48 ;
  932.         EVT_set_node( x,y, x+32,y+32, 5,MENU_clip, i+50, FALSE ) ;
  933.     }
  934.     EVT_set_node( btnx-2,btny-4, btnx+66,btny+20, 5,MENU_clip,1,FALSE ) ;
  935.     EVT_set_node( ttlx-4,ttly-4, ttlx+132,ttly+20, 5,ROLL_clip,5,FALSE ) ;
  936.     EVT_set_cancel( 5, click_cancel ) ;
  937.     EVT_control_cancel( TRUE ) ;
  938.  
  939.     MOS_horizon ( xpos, xend ) ;
  940.     MOS_vertical( ypos, yend ) ;
  941.  
  942.     KAN_dispMode() ;        /*  モード再表示  */
  943.  
  944.     mos_ptn( 0 ) ;
  945.  
  946.     return 0 ;
  947. }
  948.  
  949.  
  950. int     select_icon( u_char *icon_name, u_char *icon_cmd )
  951. {
  952.     static  int     menu_x = 36, menu_y = 72 ;
  953.     auto    int     menu = menu_event ;
  954.     auto    int     mos = mos_disp ;
  955.     auto    int     ret = -1 ;
  956.     auto    int     ch ;
  957.  
  958.     mprm.ttlx = 220 ;
  959.     mprm.func = DSP_select_icon ;
  960.     mprm.xsiz = 604-36 ;
  961.     mprm.ysiz = 410-72+48 ;
  962.     mprm.msg[0] = (char *)icon_name ;
  963.     mprm.msg[1] = (char *)icon_cmd ;
  964.     mprm.btnx[0] = mprm.xsiz/2 - 32 ;
  965.     if( ( mprm.xpos = menu_x ) + mprm.xsiz > 639 )
  966.         mprm.xpos = 639 - mprm.xsiz ;
  967.     if( ( mprm.ypos = menu_y ) + mprm.ysiz > 459 )
  968.         mprm.ypos = 459 - mprm.ysiz ;
  969.  
  970.  
  971.     MOS_disp( mos_disp = MOS_OFF ) ;
  972.  
  973.     if( now_palet != 1 )
  974.         chg_palette( 0, 1 ) ;
  975.     MOS_writePage( 1 ) ;
  976.  
  977.     DSP_select_icon();
  978.     MOS_setpos( mprm.xpos+mprm.xsiz/2, mprm.ypos+mprm.ysiz/2 ) ;
  979.  
  980.     MOS_disp( mos_disp = MOS_ON ) ;
  981.  
  982.     keyflush() ;
  983.  
  984.     do {
  985.         if( kbhit( OFF ) != FALSE )         /*  キー入力センス  */
  986.         {
  987.             if( ( ch = getch() ) == 0x1B )
  988.             {                               /*  ESC キーで取消  */
  989.                 menu_event = 2 ;    break ;
  990.             }
  991.         }
  992.         menu_event = 0 ;
  993.         EVT_loop( 5,5 ) ;
  994.     } while( ( menu_event == 0 || menu_event == 999 ) && cancel_on == FALSE ) ;
  995.  
  996.     if( menu_event >= 50 && cancel_on == FALSE )
  997.         ret = menu_event - 50 ;
  998.     cancel_on = FALSE ;
  999.  
  1000.     MOS_disp( mos_disp = MOS_OFF ) ;
  1001.  
  1002.     EVT_level_free( 5 ) ;
  1003.  
  1004.     menu_event = menu ;
  1005.  
  1006.     menu_x = mprm.xpos ;
  1007.     menu_y = mprm.ypos ;
  1008.  
  1009.     cls( 1, 0 ) ;
  1010.  
  1011.     chg_palette( 0, now_palet ) ;
  1012.     DSP_writePage( egbwork, 0 ) ;
  1013.  
  1014.     MOS_writePage( 0 ) ;
  1015.     MOS_horizon ( MIN_HORIZON,  MAX_HORIZON ) ;
  1016.     MOS_vertical( MIN_VERTICAL, MAX_VERTICAL ) ;
  1017.     MOS_disp( mos_disp = mos ) ;
  1018.  
  1019.     KAN_dispMode() ;        /*  モード再表示  */
  1020.  
  1021.     return( ret ) ;
  1022. }
  1023.  
  1024.  
  1025. /*  メッセージが表示され、下のボタンからどれかを選択する  */
  1026.  
  1027. static  int     DSP_select_mode( void )
  1028. {
  1029.     auto    int     i ;
  1030.     auto    int     ttlx,ttly, ttlxsiz,ttlysiz ;
  1031.     auto    int     xpos,ypos, btnx,btny ;
  1032.  
  1033.     xpos = mprm.xpos ;
  1034.     ypos = mprm.ypos ;
  1035.  
  1036.     /*  設定  */
  1037.     MOS_horizon ( xpos, xpos+mprm.xsiz ) ;
  1038.     MOS_vertical( ypos, ypos+mprm.ysiz ) ;
  1039.     mos_ptn( 0 ) ;
  1040.  
  1041.     /*  タイトルの位置と大きさ決め  */
  1042.     ttlx = xpos + mprm.ttlx ;
  1043.     ttly = ypos + 6 ;
  1044.     ttlxsiz = mprm.ttllen * 8 + 8 ;
  1045.     ttlysiz = 16 + 6 ;
  1046.  
  1047.     /*  ボタンの位置と大きさ決め  */
  1048.     btny = ypos + mprm.ysiz - 28 ;
  1049.  
  1050.     /*  画面作成  */
  1051.     cls( 1, 0 ) ;
  1052.     dsp_box( xpos,  ypos,   xpos+mprm.xsiz,   ypos+mprm.ysiz,   5,5,5 ) ;
  1053.     dsp_box( xpos+2,ypos+2, xpos+mprm.xsiz-2, ypos+mprm.ysiz-2, 7,8,5 ) ;
  1054.  
  1055.     dsp_box( ttlx,  ttly,   ttlx+ttlxsiz,     ttly+ttlysiz,     7,8,5 ) ;
  1056.     wrt( center( mprm.ttl,mprm.ttllen ),
  1057.                              writepage, ttlx+4,ttly+3, COL_14,BAS_COL, 16 ) ;
  1058.  
  1059.     for( i = 0 ; i < mprm.msgnum ; i ++ )
  1060.         wrt( center( mprm.msg[i], mprm.msglen ),
  1061.                 writepage, xpos+4,ypos+16+24+i*20, COL_14,BAS_COL, 16 ) ;
  1062.  
  1063.     EVT_level_free( 5 ) ;
  1064.     for( i = 0 ; i < mprm.btnnum ; i ++ )
  1065.     {
  1066.         if( mprm.btnx[i] < 0 )
  1067.             break ;
  1068.         btnx = xpos + mprm.btnx[i] ;
  1069.         dsp_box( btnx,btny, btnx+mprm.btnxsiz,btny+24, 15,7,4 ) ;
  1070.         wrt( center( mprm.btn[i], mprm.btnlen ),
  1071.                                 writepage, btnx+4,btny+4, COL_14,COL_4, 16 ) ;
  1072.         EVT_set_node( btnx,btny, btnx+mprm.btnxsiz,btny+24,
  1073.                                             5, MENU_clip, 1+i, FALSE ) ;
  1074.     }
  1075.     EVT_set_node( ttlx,ttly, ttlx+ttlxsiz,ttly+ttlysiz, 5,ROLL_clip,0, OFF ) ;
  1076.     EVT_set_cancel( 5, click_cancel ) ;
  1077.     EVT_control_cancel( TRUE ) ;
  1078.  
  1079.     KAN_dispMode() ;        /*  モード再表示  */
  1080.  
  1081.     return 0 ;
  1082. }
  1083.  
  1084. /*
  1085.  *  モードを選択する
  1086.  *
  1087.  
  1088.  *  戻り値
  1089.  *    0~2  マウスでボタンが選択された場合
  1090.  *    ボタンの返す最大値  ESCキー,右クリックによる取り消し
  1091.  *    ボタンの返す最小値  CR,実行キーによる実行
  1092. */
  1093.  
  1094. int     select_mode( char *ttl, char *msg[], char *btn[] )
  1095. {
  1096.     static  int     menu_x = 160, menu_y = 180 ;
  1097.     auto    int     len, i, ret, ch ;
  1098.     auto    int     menu = menu_event ;
  1099.     auto    int     palet = now_palet ;
  1100.  
  1101.  
  1102.     mprm.func = DSP_select_mode ;
  1103.  
  1104.     /*  ボタンの数と大きさ  */
  1105.     for( len=8, mprm.btnnum=i=0 ; i < MAX_BTN_MSG ; mprm.btnnum++, i++ )
  1106.     {
  1107.         if( btn[i] == NULL )
  1108.             break ;
  1109.         if( strlen( btn[ i ] ) > len )
  1110.             len = strlen( btn[ i ] ) ;
  1111.         mprm.btn[i] = btn[i] ;
  1112.     }
  1113.     len += ( len % 2 ) ;
  1114.     mprm.btnlen = len ;
  1115.     mprm.btnxsiz = len * 8 + 8 ;
  1116.  
  1117.     /*  メッセージの行数と大きさ  */
  1118.     for( mprm.msglen = 40, mprm.msgnum = i = 0 ; i < MAX_DSP_MSG ; i ++ )
  1119.     {
  1120.         if( msg[ i ] != NULL )
  1121.         {
  1122.             mprm.msgnum ++ ;
  1123.             if( strlen( msg[ i ] ) > mprm.msglen )
  1124.                 mprm.msglen = strlen( msg[ i ] ) ;
  1125.         }
  1126.         else
  1127.             break ;
  1128.         mprm.msg[i] = msg[i] ;
  1129.     }
  1130.     mprm.msglen += ( mprm.msglen % 2 ) == 0 ? 4 : 5 ;
  1131.  
  1132.     /*  ウィンドゥの大きさと位置  */
  1133.     mprm.xsiz = mprm.msglen * 8 + 8 ;
  1134.     mprm.ysiz = mprm.msgnum * 20 + 32 + 24 + 24 ;
  1135.     if( ( mprm.xpos = menu_x ) + mprm.xsiz > 639 )
  1136.         mprm.xpos = 639 - mprm.xsiz ;
  1137.     if( ( mprm.ypos = menu_y ) + mprm.ysiz > 459 )
  1138.         mprm.ypos = 459 - mprm.ysiz ;
  1139.  
  1140.     if( mprm.msgnum < 1 || mprm.btnnum < 1 )
  1141.         return( FALSE ) ;
  1142.  
  1143.     /*  タイトルの大きさと位置  */
  1144.     mprm.ttl = ttl ;
  1145.     len = ( strlen( ttl ) > 16 ) ? strlen( ttl ) : 16 ;
  1146.     mprm.ttllen = len ;
  1147.     mprm.ttlx = mprm.xsiz/2 - (len*8+8) / 2 ;
  1148.  
  1149.     /*  ボタンの位置  */
  1150.     switch( mprm.btnnum )
  1151.     {
  1152.       case 1:
  1153.         mprm.btnx[0] = ( mprm.xsiz - mprm.btnxsiz ) /2 ;
  1154.         break ;
  1155.  
  1156.       case 2:
  1157.         mprm.btnx[0] = mprm.xsiz/2 - mprm.btnxsiz - 4 ;
  1158.         mprm.btnx[1] = mprm.xsiz/2 + 4 ;
  1159.         break ;
  1160.  
  1161.       case 3:
  1162.         mprm.btnx[1] = ( mprm.xsiz - mprm.btnxsiz ) / 2 ;
  1163.         mprm.btnx[0] = mprm.btnx[1] - mprm.btnxsiz - 8 ;
  1164.         mprm.btnx[2] = mprm.btnx[1] + mprm.btnxsiz + 8 ;
  1165.         break ;
  1166.     }
  1167.  
  1168.  
  1169.     /*  画面作成  */
  1170.     MOS_disp( mos_disp = MOS_OFF ) ;
  1171.  
  1172.     if( now_palet != 1 )
  1173.         chg_palette( 0, now_palet = 1 ) ;
  1174.  
  1175.     MOS_writePage( 1 ) ;
  1176.     DSP_select_mode() ;
  1177.  
  1178.     /*  ループの開始  */
  1179.     MOS_disp( mos_disp = MOS_ON ) ;
  1180.  
  1181.     keyflush() ;
  1182.  
  1183.     do {
  1184.         if( kbhit( OFF ) != FALSE )         /*  キー入力センス  */
  1185.         {
  1186.             if( ( ch = getch() ) == 0x0D || ch == 0x8073 )  /*  CR で実行  */
  1187.             {
  1188.                 menu_event = 1 ;    break ;
  1189.             }
  1190.             else if( ch == 0x1B )           /*  ESC で取消  */
  1191.             {
  1192.                 menu_event = mprm.btnnum ;    break ;
  1193.             }
  1194.         }
  1195.  
  1196.         menu_event = 0 ;
  1197.         EVT_loop( 5,5 ) ;
  1198.     } while( cancel_on != TRUE && ( menu_event == 0 || menu_event == 999 ) ) ;
  1199.  
  1200.     MOS_disp( mos_disp = MOS_OFF ) ;
  1201.  
  1202.     EVT_level_free( 5 ) ;
  1203.  
  1204.     if( cancel_on != FALSE )        /*  右クリックによるキャンセル  */
  1205.         ret = mprm.btnnum-1, cancel_on = FALSE ;
  1206.     else
  1207.         ret = menu_event - 1 ;
  1208.     menu_event = menu ;
  1209.  
  1210.     menu_x = mprm.xpos ;
  1211.     menu_y = mprm.ypos ;
  1212.  
  1213.     cls( 1, 0 ) ;
  1214.     DSP_writePage( egbwork, 0 ) ;
  1215.  
  1216.     MOS_writePage( 0 ) ;
  1217.  
  1218.     MOS_horizon ( MIN_HORIZON,  MAX_HORIZON ) ;
  1219.     MOS_vertical( MIN_VERTICAL, MAX_VERTICAL ) ;
  1220.  
  1221.     MOS_disp( mos_disp = MOS_ON ) ;
  1222.  
  1223.     chg_palette( 0, now_palet = palet ) ;
  1224.  
  1225.     KAN_dispMode() ;        /*  モード再表示  */
  1226.  
  1227.     return( ret ) ;
  1228. }
  1229.  
  1230.  
  1231. void    assert( char *ttl, char *msg[] )
  1232. {
  1233.     auto    int     sw, mos_x, mos_y ;
  1234.     auto    int     sw2, mos_x2, mos_y2 ;
  1235.     auto    int     i ;
  1236.     auto    int     msg_num = 0, max_len = 32 ;
  1237.     auto    int     ttlx,ttly, ttlxsiz,ttlysiz, ttl_len = 16 ;
  1238.     auto    int     xsiz,xpos, ysiz,ypos ;
  1239.  
  1240.  
  1241.     /*  文字数を数えたり、項目数を確認する  */
  1242.     for( i = 0 ; i < MAX_DSP_MSG ; i ++ )
  1243.         if( msg[ i ] != NULL )
  1244.         {
  1245.             msg_num ++ ;
  1246.             if( strlen( msg[ i ] ) + 4 > max_len )
  1247.                 max_len = strlen( msg[ i ] ) + 4 ;
  1248.         }
  1249.         else
  1250.             break ;
  1251.     if( ( ttl_len = strlen( ttl )+4 ) > max_len )
  1252.         max_len = ttl_len ;
  1253.  
  1254.     if( msg_num < 1 || msg_num > MAX_DSP_MSG )
  1255.         return ;
  1256.  
  1257.     /*  文字列の長さにゲタをはかせる  */
  1258.     if( max_len % 2 != 0 )
  1259.         max_len ++ ;
  1260.     if( ttl_len % 2 != 0 )
  1261.         ttl_len ++ ;
  1262.  
  1263.     /*  画面を暗くして、マウスカーソルを消す  */
  1264.     MOS_disp( mos_disp = MOS_OFF ) ;
  1265.  
  1266.     if( now_palet != 1 )
  1267.         chg_palette( 0, 1 ) ;
  1268.  
  1269.  
  1270.     /*  ウィンドゥの大きさと位置  */
  1271.     ysiz = msg_num * 20 + 24 + 24 ;
  1272.     ypos = 200 - ysiz / 2 ;
  1273.     xsiz = max_len * 8 + 8 ;
  1274.     xpos = 320 - xsiz / 2 ;
  1275.  
  1276.     ttlxsiz = ttl_len * 8 + 8 ;
  1277.     ttlysiz = 18 + 4 ;
  1278.     ttlx = 320 - ttlxsiz / 2 ;
  1279.     ttly = ypos + 8 ;
  1280.  
  1281.  
  1282.     /*  画面作成  */
  1283.     MOS_PAD_rdpos( &sw, &mos_x, &mos_y ) ;
  1284.     MOS_writePage( 1 ) ;
  1285.  
  1286.     MOS_horizon ( MIN_HORIZON,  MAX_HORIZON ) ;
  1287.     MOS_vertical( MIN_VERTICAL, MAX_VERTICAL ) ;
  1288.     MOS_setpos( mos_x, mos_y ) ;
  1289.  
  1290.     cls( 1, 0 ) ;
  1291.     dsp_box( xpos,  ypos,   xpos+xsiz,   ypos+ysiz,   5,5,5 ) ;
  1292.     dsp_box( xpos+2,ypos+2, xpos+xsiz-2, ypos+ysiz-2, 7,8,5 ) ;
  1293.  
  1294.     dsp_box( ttlx,ttly, ttlx+ttlxsiz,ttly+ttlysiz, 7,8,5 ) ;
  1295.     wrt( center(ttl,ttl_len), writepage, ttlx+4,ttly+2, COL_14,BAS_COL, 16 ) ;
  1296.  
  1297.     for( i = 0 ; i < msg_num ; i ++ )
  1298.         wrt( center( msg[i], max_len ),
  1299.                 writepage, xpos+4,ypos+16+24+i*20, COL_14,BAS_COL, 16 ) ;
  1300.  
  1301.     KAN_dispMode() ;
  1302.  
  1303.     MOS_disp( mos_disp = MOS_ON ) ;
  1304.  
  1305.     for( i = 0 ; i < 250000 ; i ++ ) ;
  1306.  
  1307.     do {
  1308.         MOS_PAD_rdpos( &sw2, &mos_x2, &mos_y2 ) ;
  1309.     } while( kbhit( OFF ) == FALSE &&
  1310.              sw == sw && mos_x == mos_x2 && mos_y == mos_y2 ) ;
  1311.  
  1312.     keyflush() ;
  1313.  
  1314.     MOS_disp( mos_disp = MOS_OFF ) ;
  1315.     MOS_writePage( 0 ) ;
  1316.  
  1317.     MOS_horizon ( MIN_HORIZON,  MAX_HORIZON ) ;
  1318.     MOS_vertical( MIN_VERTICAL, MAX_VERTICAL ) ;
  1319.     MOS_setpos( mos_x2, mos_y2 ) ;
  1320.  
  1321.     MOS_disp( mos_disp = MOS_ON ) ;
  1322.  
  1323.     chg_palette( 0, now_palet ) ;
  1324.  
  1325.     cls( 1, 0 ) ;
  1326.     DSP_writePage( egbwork, 0 ) ;
  1327. }
  1328.  
  1329. static  void    DSP_edit_item_btn( char *str, int x, int y, int no )
  1330. {
  1331.     int     siz = strlen( str ) * 8 + 4 ;
  1332.  
  1333.     dsp_box( x+2,y+2, x+siz+1,y+19+1, 1,1,1 ) ;
  1334.     dsp_box( x,y, x+siz,y+19, 1,1,15 ) ;
  1335.     wrt( str, writepage, x+3,y+2, COL_1,COL_15, 16 ) ;
  1336.     EVT_set_node( x,y, x+siz,y+19, 5,MENU_clip,no, FALSE ) ;
  1337. }
  1338.  
  1339. int     DSP_edit_item( void )
  1340. {
  1341.     auto    int     xpos, ypos, xend, yend, x, y ;
  1342.     auto    int     mx, my, sw, mos = mos_disp ;
  1343.  
  1344.     xpos = mprm.xpos ;
  1345.     ypos = mprm.ypos ;
  1346.     xend = xpos + mprm.xsiz ;
  1347.     yend = ypos + mprm.ysiz ;
  1348.  
  1349.     /*  画面作成  */
  1350.     MOS_disp( MOS_OFF ) ;
  1351.     MOS_PAD_rdpos( &sw, &mx, &my ) ;
  1352.  
  1353.     MOS_writePage( 1 ) ;
  1354.     MOS_horizon ( xpos, xend ) ;
  1355.     MOS_vertical( ypos, yend ) ;
  1356.  
  1357.     DSP_writePage( egbwork, 1 ) ;
  1358.     wind_close() ;
  1359.     EVT_level_free( 5 ) ;
  1360.  
  1361.     MOS_disp( MOS_OFF ) ;
  1362.  
  1363.     EVT_set_cancel( 5, click_cancel ) ;
  1364.     EVT_control_cancel( ON ) ;
  1365.  
  1366.     cls( 1, 0 ) ;
  1367.     dsp_box( xpos,ypos, xend,yend, 15,15,15 ) ;
  1368.     box2( xpos+2,ypos+2, xend-2,yend-2, 0,0 ) ;
  1369.  
  1370.     x = xpos+mprm.xsiz/2-4*16 ;  y = ypos + 6 ;
  1371.     dsp_box( x,y, x+8*16,y+20, 1,1,7 ) ;
  1372.     wrt( "アイテム編集", writepage, x+16,y+2, COL_15,COL_7, 16 ) ;
  1373.     EVT_set_node( x,y, x+8*16,y+20, 5,ROLL_clip,3, FALSE ) ;
  1374.  
  1375.     DSP_edit_item_btn( " 取 消 ", xpos+mprm.xsiz/2+4, yend-28, 5 ) ;
  1376.     DSP_edit_item_btn( " 実 行 ", xpos+mprm.xsiz/2-64-4, yend-28, 6 ) ;
  1377.  
  1378.     x = xpos+mprm.ttlx ;      y = ypos+mprm.ttly ;
  1379.     dsp_ptn( x,y, (char *)&icon[ mprm.ttllen ], 1 ) ;
  1380.     EVT_set_node( x,y, x+31,y+31, 5,ITEM_clip,20, FALSE ) ;
  1381.  
  1382.     x = xpos+mprm.btnx[0] ;   y = ypos+mprm.btny[0] ;
  1383.     box2( x,y, x+mprm.btnlen*8+2,y+19, 1,1 ) ;
  1384.     wrt( mprm.btn[0], writepage, x+2,y+2, COL_1,COL_15, 16 ) ;
  1385.     EVT_set_node( x,y, x+mprm.btnlen*8+2,y+19, 5,TEXT_clip,1, FALSE ) ;
  1386.  
  1387.     x = xpos+mprm.btnx[1] ;   y = ypos+mprm.btny[1] ;
  1388.     box2( x,y, x+mprm.msglen*8+2,y+19, 1,1 ) ;
  1389.     wrt( mprm.btn[1], writepage, x+2,y+2, COL_1,COL_15, 16 ) ;
  1390.     EVT_set_node( x,y, x+mprm.msglen*8+2,y+19, 5,TEXT_clip,2, FALSE ) ;
  1391.  
  1392.     DSP_edit_item_btn( mprm.sw[0], xpos+mprm.swx[0], ypos+mprm.swy[0], 10 ) ;
  1393.  
  1394.     KAN_dispMode() ;        /*  モード再表示  */
  1395.  
  1396.     MOS_setpos( mx, my ) ;
  1397.     MOS_disp( mos_disp = mos ) ;
  1398.  
  1399.     return 0 ;
  1400. }
  1401.  
  1402. /*
  1403.  *  アイテム編集
  1404.  
  1405.  *  実行/取消のどちらのボタンで終わったかによって
  1406.  *      実行 : TRUE
  1407.  *      取消 : FALSE
  1408.  *  を返す
  1409. */
  1410.  
  1411. int     edit_item( INF *ip )        /*  内容編集  */
  1412. {
  1413.     static  int     menu_x = 61, menu_y = 100 ;
  1414.     auto    int     menu = menu_event ;
  1415.     auto    int     palet = now_palet ;
  1416.     auto    int     mos = mos_disp ;
  1417.     auto    int     return_value = FALSE ;
  1418.     auto    int     ch, mx,my, icon_num ;
  1419.     auto    int     buflen[2] ;
  1420.     auto    int     dirmode ;
  1421.     auto    char    buf[2][80] ;
  1422.     auto    MENU_PRM    tmpprm ;
  1423.  
  1424.     MOS_PAD_rdpos( &ch, &mx,&my ) ;
  1425.  
  1426.     /*  画面を暗くして、マウスカーソルを消す  */
  1427.     if( now_palet != 1 )
  1428.         chg_palette( 0, now_palet = 1 ) ;
  1429.     MOS_disp( mos_disp = MOS_OFF ) ;
  1430.  
  1431.     icon_num = ip->icon_num ;
  1432.     strcpy( buf[0], (char *)ip->name ) ;    /*  アイテム名  */
  1433.     strcpy( buf[1], (char *)ip->cmd ) ;     /*  アイテム・パラメータ  */
  1434.     dirmode = ip->dirflag ;
  1435.  
  1436.     buflen[0] = 12 ;
  1437.     buflen[1] = 63 ;
  1438.  
  1439.     mprm.xsiz = 536 ;
  1440.     mprm.ysiz = 170 ;
  1441.     if( ( mprm.xpos = menu_x ) + mprm.xsiz > 639 )
  1442.         mprm.xpos = 639 - mprm.xsiz ;
  1443.     if( ( mprm.ypos = menu_y ) + mprm.ysiz > 459 )
  1444.         mprm.ypos = 459 - mprm.ysiz ;
  1445.     mprm.ttllen = ip->icon_num ;
  1446.     mprm.ttlx = 15 ;                 /*  アイコン表示位置  */
  1447.     mprm.ttly = 30 ;
  1448.     mprm.btn[0] = buf[0] ;              /*  アイテム名  */
  1449.     mprm.btnx[0] = 15 ;              /*  アイテム名表示位置  */
  1450.     mprm.btny[0] = 70 ;
  1451.     mprm.btnlen = 12 ;
  1452.     mprm.btn[1] = buf[1]  ;             /*  アイテム・パラメータ  */
  1453.     mprm.btnx[1] = 15 ;              /*  アイテム・パラメータ表示位置  */
  1454.     mprm.btny[1] = 100 ;
  1455.     mprm.sw[0] = get_dirmode( dirmode ) ;
  1456.     mprm.swx[0] = 460 ;
  1457.     mprm.swy[0] = 70 ;
  1458.     mprm.swnum = 1 ;
  1459.     mprm.swlen = strlen( mprm.sw[0] ) ;
  1460.     mprm.msglen = 63 ;
  1461.     mprm.func = DSP_edit_item ;
  1462.  
  1463.     maxnum ++ ;     /*  ひとつもアイテムが登録されてない状態で新規登録を
  1464.                         しようとした時、ITEM_clipルーチンのチェックに
  1465.                         ひっかかるため  */
  1466.  
  1467.     DSP_edit_item() ;
  1468.  
  1469.     curlin = 0 ;
  1470.     menu_event = 1 ;
  1471.  
  1472.     MOS_disp( mos_disp = MOS_ON ) ;
  1473.  
  1474.     keyflush() ;
  1475.  
  1476.     while( 1 )
  1477.     {
  1478.         EVT_loop( 5, 5 ) ;
  1479.  
  1480.         if( cancel_on == TRUE || menu_event == 5 || menu_event == 6 )
  1481.             break ;
  1482.  
  1483.         if( menu_event == 0 && kbhit( ON ) == FALSE )
  1484.             continue ;
  1485.  
  1486.         if( kbhit( ON ) != FALSE )       /*  キー入力センス  */
  1487.         {
  1488.             ch = getch() ;
  1489.  
  1490.             if( ch == 0x8073 )    /*  実行キーで登録終了  */
  1491.             {
  1492.                 putch( ch ) ;
  1493.                 menu_event = 6 ;
  1494.                 break ;
  1495.             }
  1496.             if( ch == 0x1B )    /*  ESC で取消終了  */
  1497.             {
  1498.                 putch( ch ) ;
  1499.                 menu_event = 5 ;
  1500.                 break ;
  1501.             }
  1502.  
  1503.             switch( ch )
  1504.             {
  1505.               case '\x1E':      /*  上矢印  */
  1506.               case '\x05':      /*  ^E  */
  1507.                 if( ( -- curlin ) < 0 )
  1508.                     curlin = 0 ;
  1509.                 break ;
  1510.  
  1511.               case '\x0D':      /*  リターン  */
  1512.                 curpos = 0 ;
  1513.               case '\x1F':      /*  下矢印  */
  1514.               case '\x18':      /*  ^X  */
  1515.                 if( ( ++ curlin ) > 1 )
  1516.                     curlin = 1 ;
  1517.                 break ;
  1518.  
  1519.               default:          /*  その他は行編集関数へ渡す  */
  1520.                 putch( ch ) ;
  1521.                 continue ;
  1522.             }
  1523.         }
  1524.  
  1525.         switch( menu_event )
  1526.         {
  1527.           case 1:   curlin = 0 ;    break ;
  1528.           case 2:   curlin = 1 ;    break ;
  1529.  
  1530.           case 10:  /*  起動/移動 切り換え  */
  1531.             dirmode = chg_dirmode( dirmode ) ;
  1532.             mprm.sw[0] = get_dirmode( dirmode ) ;
  1533.  
  1534.             MOS_disp( MOS_OFF ) ;
  1535.             DSP_edit_item_btn( mprm.sw[0],
  1536.                         mprm.xpos+mprm.swx[0], mprm.ypos+mprm.swy[0], 10 ) ;
  1537.             MOS_disp( MOS_ON ) ;
  1538.             break ;
  1539.  
  1540.           case 20:      /*  アイコン選択  */
  1541.             memcpy( &tmpprm, &mprm, sizeof( MENU_PRM ) ) ;
  1542.             if( ( ch = select_icon( ip->name, ip->cmd ) ) != -1 )
  1543.                 icon_num = ch ;
  1544.             memcpy( &mprm, &tmpprm, sizeof( MENU_PRM ) ) ;
  1545.             mprm.ttllen = icon_num ;
  1546.             DSP_edit_item() ;
  1547.         }
  1548.  
  1549.         wind_open(
  1550.             mprm.xpos+mprm.btnx[curlin]+2,
  1551.             mprm.ypos+mprm.btny[curlin]+2,
  1552.             buflen[curlin],&curpos, 1,15,5, buf[curlin] ) ;
  1553.  
  1554.         menu_event = 0 ;
  1555.     }
  1556.  
  1557.     wind_close() ;
  1558.  
  1559.     MOS_disp( mos_disp = MOS_OFF ) ;
  1560.  
  1561.     if( menu_event == 6 )       /*  [登録]ボタンで終了  */
  1562.     {
  1563.         strcpy( (char *)ip->name, buf[0] ) ;    /*  アイテム名  */
  1564.         strcpy( (char *)ip->cmd, buf[1] ) ;     /*  アイテム・パラメータ  */
  1565.         ip->icon_num = icon_num ;
  1566.         ip->dirflag = dirmode ;
  1567.         return_value = TRUE ;
  1568.     }
  1569.  
  1570.     cls( 1, 0 ) ;
  1571.     DSP_writePage( egbwork, 0 ) ;
  1572.  
  1573.     MOS_writePage( 0 ) ;
  1574.     mos_ptn( 0 ) ;
  1575.     MOS_horizon ( MIN_HORIZON,  MAX_HORIZON ) ;
  1576.     MOS_vertical( MIN_VERTICAL, MAX_VERTICAL ) ;
  1577.     MOS_setpos( mx, my ) ;
  1578.     MOS_disp( mos_disp = mos ) ;
  1579.  
  1580.     chg_palette( 0, now_palet = palet ) ;
  1581.  
  1582.     menu_x = mprm.xpos ;
  1583.     menu_y = mprm.ypos ;
  1584.     menu_event = menu ;
  1585.  
  1586.     maxnum -- ;     /*  ひとつもアイテムが登録されてない状態で新規登録を
  1587.                         しようとした時、ITEM_clipルーチンのチェックに
  1588.                         ひっかかるため  */
  1589.  
  1590.     KAN_dispMode() ;        /*  モード再表示  */
  1591.  
  1592.     return return_value ;
  1593. }
  1594.  
  1595.